home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WW3DKit / WW3DShapeControlPanel.m < prev    next >
Encoding:
Text File  |  1995-03-22  |  7.6 KB  |  380 lines

  1. // copyright 1993 Michael B. Johnson; some portions copyright 1994, MIT
  2. // see COPYRIGHT for reuse legalities
  3. //
  4.  
  5.  
  6. #import "WW3DShapeControlPanel.h"
  7. #import "WW3DShape.h"
  8. #import "PAThumbWheel.h"
  9.  
  10. @implementation WW3DShapeControlPanel
  11.  
  12. - init
  13. {
  14.    [super init];
  15.  
  16.    absoluteTransforms = 0;
  17.    preConcat = 1;
  18.    xRotateOrTranslate = 0;
  19.    yRotateOrTranslate = 0;
  20.    zRotateOrTranslate = 0;
  21.  
  22.    return self;
  23. }
  24.  
  25.  
  26. - free
  27. {
  28.   if (matricesPanel)
  29.   {  [matricesPanel free];
  30.   }
  31.   if (transformPanel)
  32.   {  [transformPanel free];
  33.   }
  34.   if (ribPanel)
  35.   {  [ribPanel free];
  36.   }
  37.   if (shadingPanel)
  38.   {  [shadingPanel free];
  39.   }
  40.   if (theControlPanel)
  41.   {  [theControlPanel close];
  42.   }
  43.   return [super free];
  44. }
  45.  
  46.  
  47. - setShape:newShape  { shape = newShape;   return self; }
  48.  
  49. - showControlPanel:sender
  50. {
  51.   if (!theControlPanel)
  52.   {  id     bundle = [NXBundle bundleForClass: [self class]];
  53.      char   path[MAXPATHLEN + 1];
  54.  
  55.      if (!bundle) 
  56.      {  NXLogError("No bundle for Class %s - unable to showControlPanel\n", [self name]);
  57.         return nil;
  58.      }
  59.      if (![bundle getPath:path forResource:"WW3DShapeControlPanel" ofType:"nib"])
  60.      {  NXLogError("No path for WW3DShapeControlPanel.nib.\n");
  61.         return nil;
  62.      }
  63.      [NXApp loadNibFile:path owner:self  withNames:NO fromZone:[self zone]];
  64.      //NXLogError ("Loaded %s.\n", path);
  65.   }
  66.   [self revert:nil];
  67.   [theControlPanel display];
  68.   [theControlPanel makeKeyAndOrderFront:sender];
  69.   return self;
  70. }
  71.  
  72. - drawRtMatrix:(RtMatrix)anRtMatrix inMatrix:aMatrix
  73. {
  74.   int  i, j;
  75.  
  76.  
  77.   for (i = 0; i < 4; i++)
  78.   {  for (j = 0; j < 4; j++)
  79.      {  [[aMatrix cellAt:i :j] setFloatValue:anRtMatrix[i][j]];
  80.      }
  81.   }
  82.   return self;
  83. }
  84.  
  85. - fillRIBCommandsMatrix:theMatrix
  86. {
  87.    int  howMany, i;
  88.    id   newCell;
  89.  
  90.  
  91.    howMany = [[theMatrix cellList] count];
  92.    for (i = 0; i < howMany; i++)
  93.    {  [theMatrix removeRowAt:0 andFree:YES];
  94.       [theMatrix sizeToCells];
  95.    }
  96.    howMany = [[shape ribCommands] count];
  97.    for (i = 0; i < howMany; i++)
  98.    {  [theMatrix addRow];
  99.       [theMatrix sizeToCells];
  100.       newCell = [theMatrix cellAt:i :0];
  101. //Note: these really should be double-clickable themselves...
  102.       [newCell setStringValue:[[[[shape ribCommands] objectAt:i] class] name]];
  103.    }
  104.  
  105.    return self;
  106. }
  107.  
  108.  
  109. - revert:sender
  110. {
  111.    RtMatrix  anRtMatrix;
  112.    RtBound   boundingBox;
  113.  
  114.  
  115.    [relativeAbsoluteButtons selectCellWithTag:absoluteTransforms];
  116.    [prePostButtons selectCellWithTag:preConcat];
  117.  
  118.    [shapeName setStringValue:[shape shapeName]];
  119.  
  120.    [(WW3DShape *)shape getBoundingBox:&boundingBox];
  121.    [[boundingBoxMatrix cellAt:0 :0] setFloatValue:boundingBox[0]];
  122.    [[boundingBoxMatrix cellAt:1 :0] setFloatValue:boundingBox[1]];
  123.    [[boundingBoxMatrix cellAt:0 :1] setFloatValue:boundingBox[2]];
  124.    [[boundingBoxMatrix cellAt:1 :1] setFloatValue:boundingBox[3]];
  125.    [[boundingBoxMatrix cellAt:0 :2] setFloatValue:boundingBox[4]];
  126.    [[boundingBoxMatrix cellAt:1 :2] setFloatValue:boundingBox[5]];
  127.  
  128.    [shape getInitialTransformMatrix:anRtMatrix];
  129.    [self drawRtMatrix:anRtMatrix inMatrix:initialTransformMatrix];
  130.    [shape getTransformMatrix:anRtMatrix];
  131.    [self drawRtMatrix:anRtMatrix inMatrix:transformMatrix];
  132.    [shape getCompositeTransformMatrix:anRtMatrix relativeToAncestor:[shape ancestor]];
  133.    [self drawRtMatrix:anRtMatrix inMatrix:compositeTransformMatrix];
  134.  
  135.    [self fillRIBCommandsMatrix:ribCommandsMatrix];
  136.  
  137.    return self;
  138. }
  139.  
  140.  
  141. - setTransformMatrix_:sender
  142. {
  143.    int  i, j;
  144.  
  145.  
  146.    for (i = 0; i < 4; i++)
  147.    {  for (j = 0; j < 4; j++)
  148.       {  tmpMatrix[i][j] = [[sender cellAt:i :j] floatValue];
  149.       }
  150.    }
  151.    [shape setTransformMatrix:tmpMatrix];
  152.  
  153.    return self;
  154. }
  155.  
  156. - firmCTM:sender
  157. {
  158.     return self;
  159. }
  160.  
  161. - hardenPoints:sender
  162. {
  163.     return self;
  164. }
  165.  
  166. - setCompositeTransformMatrix_:sender
  167. {
  168.     return self;
  169. }
  170.  
  171. - setInitialTransformMatrix_:sender
  172. {
  173.     return self;
  174. }
  175.  
  176. - setRelativeOrAbsolute_:sender
  177. {
  178.   absoluteTransforms = [[sender selectedCell] tag];
  179.   return self;
  180. }
  181.  
  182. - setPreOrPost_:sender
  183. {
  184.   preConcat = [[sender selectedCell] tag];
  185.   return self;
  186. }
  187.  
  188. - setXConstrained_:sender
  189. {
  190.     return self;
  191. }
  192.  
  193. - setXMax_:sender
  194. {
  195.     return self;
  196. }
  197.  
  198. - setXMin_:sender
  199. {
  200.     return self;
  201. }
  202.  
  203. - setXRotateOrTranslate_:sender
  204. {
  205.    xRotateOrTranslate = [[sender selectedCell] tag];
  206.     return self;
  207. }
  208.  
  209. - setXValue_:sender
  210. {
  211.   RtPoint anAxis = { 1.0, 0.0, 0.0 };
  212.  
  213.  
  214.   if (yRotateOrTranslate)  // rotate is 0, translate is 1
  215.   {  if (absoluteTransforms)
  216.      {  [shape getTransformMatrix:tmpMatrix];
  217.         tmpMatrix[3][0] = [sender floatValue];
  218.         [shape setTransformMatrix:tmpMatrix];
  219.      }
  220.      else
  221.      {  if (preConcat)
  222.         {  [shape preTranslate:[sender floatValue] :0.0 :0.0];
  223.         }
  224.         else
  225.         {  [shape translate:[sender floatValue] :0.0 :0.0];
  226.         }
  227.      }
  228.   }
  229.   else
  230.   {  if (absoluteTransforms)
  231.      {  [shape getTransformMatrix:tmpMatrix];
  232.         // do some stuff to the matrix here...
  233.         [shape setTransformMatrix:tmpMatrix];
  234.      }
  235.      else
  236.      {  if (preConcat)
  237.         {  [shape preRotateAngle:[sender floatValue] axis:anAxis];
  238.         }
  239.         else
  240.         {  [shape rotateAngle:[sender floatValue] axis:anAxis];
  241.         }
  242.      }
  243.   }
  244.   return self;
  245. }
  246.  
  247. - setYConstrained_:sender
  248. {
  249.     return self;
  250. }
  251.  
  252. - setYMax_:sender
  253. {
  254.     return self;
  255. }
  256.  
  257. - setYMin_:sender
  258. {
  259.     return self;
  260. }
  261.  
  262. - setYRotateOrTranslate_:sender
  263. {
  264.    yRotateOrTranslate = [[sender selectedCell] tag];
  265.     return self;
  266. }
  267.  
  268. - setYValue_:sender
  269. {
  270.   RtPoint anAxis = { 0.0, 1.0, 0.0 };
  271.  
  272.  
  273.   if (yRotateOrTranslate)  // rotate is 0, translate is 1
  274.   {  if (absoluteTransforms)
  275.      {  [shape getTransformMatrix:tmpMatrix];
  276.         tmpMatrix[3][1] = [sender floatValue];
  277.         [shape setTransformMatrix:tmpMatrix];
  278.      }
  279.      else
  280.      {  if (preConcat)
  281.         {  [shape preTranslate:0.0 :[sender floatValue] :0.0];
  282.         }
  283.         else
  284.         {  [shape translate:0.0 :[sender floatValue] :0.0];
  285.         }
  286.      }
  287.   }
  288.   else
  289.   {  if (absoluteTransforms)
  290.      {  [shape getTransformMatrix:tmpMatrix];
  291.         // do some stuff to the matrix here...
  292.         [shape setTransformMatrix:tmpMatrix];
  293.      }
  294.      else
  295.      {  if (preConcat)
  296.         {  [shape preRotateAngle:[sender floatValue] axis:anAxis];
  297.         }
  298.         else
  299.         {  [shape rotateAngle:[sender floatValue] axis:anAxis];
  300.         }
  301.      }
  302.   }
  303.   return self;
  304. }
  305.  
  306. - setZConstrained_:sender
  307. {
  308.     return self;
  309. }
  310.  
  311. - setZMax_:sender
  312. {
  313.     return self;
  314. }
  315.  
  316. - setZMin_:sender
  317. {
  318.     return self;
  319. }
  320.  
  321. - setZRotateOrTranslate_:sender
  322. {
  323.    zRotateOrTranslate = [[sender selectedCell] tag];
  324.     return self;
  325. }
  326.  
  327. - setZValue_:sender
  328. {
  329.   RtPoint  anAxis = { 0.0, 0.0, 1.0 };
  330.   RtFloat  aVal;
  331.  
  332.  
  333.   if (yRotateOrTranslate)  // rotate is 0, translate is 1
  334.   {  if (absoluteTransforms)
  335.      {  [shape getTransformMatrix:tmpMatrix];
  336.         tmpMatrix[3][2] = [sender floatValue];
  337.         [shape setTransformMatrix:tmpMatrix];
  338.      }
  339.      else
  340.      {  if ([sender respondsTo:(@selector(relativeFloatValue))])
  341.         {  aVal = [sender relativeFloatValue];
  342.         }
  343.         else
  344.         {  aVal = [sender floatValue];
  345.         }
  346.         if (preConcat)
  347.         {  [shape preTranslate:0.0 :0.0 :aVal];
  348.         }
  349.         else
  350.         {  [shape translate:0.0 :0.0 :aVal];
  351.         }
  352.      }
  353.   }
  354.   else
  355.   {  if (absoluteTransforms)
  356.      {  [shape getTransformMatrix:tmpMatrix];
  357.         // do some stuff to the matrix here...
  358.         [shape setTransformMatrix:tmpMatrix];
  359.      }
  360.      else
  361.      {  if ([sender respondsTo:(@selector(relativeFloatValue))])
  362.         {  aVal = [sender relativeFloatValue];
  363.         }
  364.         else
  365.         {  aVal = [sender floatValue];
  366.         }
  367.         if (preConcat)
  368.         {  [shape preRotateAngle:aVal axis:anAxis];
  369.         }
  370.         else
  371.         {  [shape rotateAngle:aVal axis:anAxis];
  372.         }
  373.      }
  374.   }
  375.   return self;
  376. }
  377.  
  378.  
  379. @end
  380.